package view.admin.equipTypeManage;

import com.jfoenix.controls.JFXCheckBox;
import com.jfoenix.controls.JFXTextField;
import controller.EquipTypeController;
import dao.EquipMsgDao;
import dao.EquipTypeDao;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.control.Alert;
import javafx.scene.control.TableCell;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.util.Callback;
import pojo.equip.EquipTypeEntity;
import pojo.equip.EquipTypeProperty;
import view.Main;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
 * @author Limohan
 */
public class EquipTypeManageController {
    private Main myApp;
    private static List<EquipTypeEntity> equipTypeEntities = new ArrayList<>() ;

    public EquipTypeManageController() {
    }

    public void setApp(Main myApp){
        this.myApp = myApp;
    }

    @FXML
    private JFXTextField getInfo;

    @FXML
    private TableView<EquipTypeProperty> typeTable;

    @FXML
    private TableColumn<EquipTypeProperty, Void> option;

    @FXML
    private TableColumn<EquipTypeProperty,String> id;

    @FXML
    private TableColumn<EquipTypeProperty,String> type;

    @FXML
    void initialize() throws IOException {
        EquipTypeDao equipTypeDao = new EquipTypeDao();
        this.displayInfo(equipTypeDao.findTypeList());
    }

    @FXML
    void changeType(ActionEvent event) throws IOException {
        Alert alert = new Alert(Alert.AlertType.INFORMATION);
        EquipTypeDao equipTypeDao = new EquipTypeDao();
        EquipMsgDao equipMsgDao = new EquipMsgDao();
        if(equipTypeEntities.size()>1) {
            alert.setHeaderText("!");
            alert.setContentText("只能选择一个哦");
            alert.showAndWait();
            equipTypeEntities = new ArrayList<>();
        }else if(equipTypeEntities.size() == 0){
            alert.setHeaderText("!");
            alert.setContentText("至少选择一个");
            alert.showAndWait();
        }
        else {
            if(equipTypeDao.isType(getInfo.getText())){
                alert.setHeaderText("!");
                alert.setContentText("已有该类型设备");
                alert.showAndWait();
            }else{
                equipTypeDao.changeType(equipTypeEntities.get(0),getInfo.getText());
                equipMsgDao.changeType(equipTypeEntities.get(0).getName(),getInfo.getText());

            }

        }
        this.displayInfo(equipTypeDao.findTypeList());
        equipTypeEntities = new ArrayList<>();

    }

    @FXML
    void createType(ActionEvent event) throws IOException {
        Alert alert = new Alert(Alert.AlertType.INFORMATION);
        EquipTypeDao equipTypeDao = new EquipTypeDao();
        EquipTypeEntity equipTypeEntity = new EquipTypeEntity();
        EquipTypeController equipTypeController = EquipTypeController.getInstance();
        if(getInfo.getText().equals("")){
            alert.setHeaderText("!");
            alert.setContentText("请输入类别名称");
            alert.showAndWait();
        }
        equipTypeEntity.setName(getInfo.getText());

        alert.setHeaderText("!");
        alert.setContentText(equipTypeController.addType(equipTypeEntity));
        alert.showAndWait();
        this.displayInfo(equipTypeDao.findTypeList());




    }

    @FXML
    void deleteType(ActionEvent event) throws Exception {
        typeTable.setItems(FXCollections.emptyObservableList());
        EquipTypeDao equipTypeDao = new EquipTypeDao();
        EquipMsgDao equipMsgDao = new EquipMsgDao();

        for(EquipTypeEntity equipTypeEntity:equipTypeEntities) {
            if(equipMsgDao.findType(equipTypeEntity.getName())){
                Alert alert = new Alert(Alert.AlertType.INFORMATION);
                alert.setHeaderText("!");
                alert.setContentText("此类别已被占用，不能删除");
                alert.showAndWait();
            }else{
                equipTypeDao.deleteType(equipTypeEntity.getId());
            }
        }
        this.initialize();
        equipTypeEntities = new ArrayList<>();

    }

    @FXML
    void returnMenu(ActionEvent event) throws Exception {
        myApp.goToAdminLoginPage();

    }
    @FXML
    void returnAllInfo(ActionEvent event)throws Exception{
        EquipTypeDao equipTypeDao = new EquipTypeDao();
        this.displayInfo(equipTypeDao.findTypeList());
    }

    @FXML
    void searchType(ActionEvent event) throws IOException {
        EquipTypeDao equipTypeDao = new EquipTypeDao();
        String str = getInfo.getText();
        List<EquipTypeEntity> TypeEntities = equipTypeDao.findTypeByName(str);
        this.displayInfo(TypeEntities);

    }
    private void addButtonToTable(){
        EquipTypeDao equipTypeDao = new EquipTypeDao();
        Callback<TableColumn<EquipTypeProperty, Void>, TableCell<EquipTypeProperty, Void>> cellFactory = new Callback<TableColumn<EquipTypeProperty, Void>, TableCell<EquipTypeProperty, Void>>() {
            @Override
            public TableCell<EquipTypeProperty, Void> call(final TableColumn<EquipTypeProperty, Void> param) {
                final TableCell<EquipTypeProperty, Void> cell = new TableCell<>() {

                    final JFXCheckBox btn = new JFXCheckBox();

                    {
                        btn.setOnAction((ActionEvent event) -> {
                            EquipTypeProperty equipTypeProperty = getTableView().getItems().get(getIndex());
                            try {
                                equipTypeEntities.add(equipTypeDao.findType(equipTypeProperty.getName()));
                            } catch (IOException e) {
                                e.printStackTrace();
                            }

                        });
                    }

                    @Override
                    public void updateItem(Void item, boolean empty) {
                        super.updateItem(item, empty);
                        if (empty) {
                            setGraphic(null);
                        } else {
                            setGraphic(btn);
                        }
                    }
                };
                return cell;
            }
        };

        option.setCellFactory(cellFactory);

    }
    void displayInfo(List<EquipTypeEntity> equipTypeEntityList){
        typeTable.getItems();
        ObservableList<EquipTypeProperty> equipTypeProperties = FXCollections.observableArrayList();
        if(equipTypeEntityList!=null){
            for(EquipTypeEntity equipTypeEntity:equipTypeEntityList){
                EquipTypeProperty equipTypeProperty = new EquipTypeProperty();
                equipTypeProperty.setName(equipTypeEntity.getName());
                equipTypeProperty.setId(equipTypeEntity.getId());
                equipTypeProperties.add(equipTypeProperty);
            }
            addButtonToTable();
            id.setCellValueFactory(param -> param.getValue().idProperty());
            type.setCellValueFactory(param -> param.getValue().nameProperty());
            typeTable.setItems(equipTypeProperties);
        }else{
            typeTable.setItems(FXCollections.emptyObservableList());
        }

    }
}
